package com.wongoing.apiclient.weixin;

import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;

import com.wongoing.apiclient.weixin.WXPayConstants.SignType;
import com.wongoing.bus.util.PayUrlConstants;
import com.wongoing.jwt.JwtUserModel;
import com.wongoing.util.Constants;
import com.wongoing.util.LogService;
import com.wongoing.util.QRCodeUtil;
import com.wongoing.util.ResourceUtil;
import com.wongoing.util.UrlConstants;

/**
 * 功能说明：此类封装微信支付对外接口
 * 修改说明：
 * @author 吴兆强
 * @date 2018年6月19日 下午10:59:02
 * @version V0.1
 */
public class WxPayManagerImpl implements IWxPayManager{

	/**
	 * 功能说明：返回直接调起APP操作的微信H5调起方式
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月19日 下午5:14:56
	 * @param out_trade_no 商户订单号
	 * @param total_fee 总金额
	 * @param body 商品描述
	 * @param product_id 产品ID
	 * @param ip 请求IP
	 * @return
	 * @throws Exception
	 */
	public String wxH5Pay(String out_trade_no, String total_fee, String body,String product_id, String ip) throws Exception{
		Map<String, String> wxPayMap = WXPayHelper.getInstance().weixinWapH5PayResult(out_trade_no,total_fee, body, product_id, ip);
		if(wxPayMap.containsKey("mweb_url")) 
			return WXPayHelper.getInstance().goWxPayDeeplinkStr(wxPayMap, ip);
		return null;
	};
	
	/**
	 * 功能说明：微信公众号支付调起接口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月19日 下午10:23:48
	 * @param openid 微信openId
	 * @param outTradeNo 商户订单号
	 * @param totalFee 总金额
	 * @param body 商品描述
	 * @param productId 产品ID
	 * @param ip 请求IP
	 * @return
	 * @throws Exception
	 */
	public Map<String,String> wxPublicAccountPay(String openid, String outTradeNo, String totalFee, String body, String productId, String ip) throws Exception{
 		Map<String, String> wxPayMap = WXPayHelper.getInstance().weixinH5PayResult(openid, outTradeNo, totalFee, body, productId, ip);
		String timeStamp = WXPayUtil.getCurrentTimestamp()+"";
		Map<String,String> data = new HashMap<String, String>();
		data.put("appId", WXPayConfigImpl.getInstance().getAppID());
		data.put("timeStamp", timeStamp);
		data.put("nonceStr", wxPayMap.get("nonce_str"));
		data.put("package", "prepay_id="+wxPayMap.get("prepay_id"));
		data.put("signType", "HMAC-SHA256");
		LogService.getInstance(this).info("Pay sign_type= HMAC-SHA256");
		String signature = WXPayUtil.generateSignature(data, WXPayConfigImpl.getInstance().getKey(), SignType.HMACSHA256);
		data.put("signature", signature);
		LogService.getInstance(this).info("Pay signature=" + signature);
		return data;
	}

	/**
	 * 功能说明：微信网页扫码支付
	 * 修改说明：如果有其他特性化参数，请在接口中完成url的继续拼接
	 * @author 吴兆强
	 * @date 2018年6月28日 上午8:40:18
	 * @param out_trade_no
	 * @param total_fee
	 * @param body
	 * @param product_id
	 * @param ip
	 * @return
	 * @throws Exception
	 */
	@Override
	public String wxWebScanQRCodePay(String outTradeNo, String totalFee, String body, String productId,
			String ip, String returnUrl) throws Exception {
		returnUrl = returnUrl.replace("#", "%23");
		//获取图片名
		JwtUserModel user = ResourceUtil.getCurrentUser();
		String qrcodeImgName = user!=null?user.getUserName():"system_user_"+System.currentTimeMillis();
		String qrcodeUrl = Constants.ERROR;
		Map<String, String> data = WXPayHelper.getInstance().weixinPayResult(outTradeNo, totalFee, body, productId, ip);
		String returnCode = data.get("return_code");
		String resultCode = data.get("result_code");
		if("SUCCESS".equals(returnCode) && "SUCCESS".equals(resultCode)) 
			qrcodeUrl = QRCodeUtil.encodeFixedPath(data.get("code_url"), qrcodeImgName);
		qrcodeUrl = qrcodeUrl.replace("\\", "%5C");
		String url = UrlConstants.BASE_URL + "/pay/open/wxScanQRCodePage?qrcodeUrl=%s&qrcodeImgName=%s&outTradeNo=%s&totalFee=%s&body=%s&productId=%s&ip=%s&returnUrl=%s";
		url = String.format(url, qrcodeUrl, qrcodeImgName, outTradeNo, totalFee, body, productId, ip, returnUrl);
		return url;
		
	}

	/**
	 * 功能说明：微信订单产讯统一入口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年6月28日 上午9:43:51
	 * @param outTradeNo
	 * @return
	 * @throws Exception 
	 */
	@Override
	public Map<String, String> wxPayQuery(String outTradeNo) throws Exception {
		return WXPayHelper.getInstance().weixinPayQuery(outTradeNo);
	}
	
	/**
	 * 功能说明：微信退款统一入口
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年7月3日 下午3:11:40
	 * @param out_trade_no
	 * @param out_refund_no
	 * @param total_fee
	 * @param refund_fee
	 * @return
	 * @throws Exception
	 */
	@Override
	public Map<String, String> wxPayRefund(String out_trade_no, String out_refund_no, String total_fee,
			String refund_fee) throws Exception {
		return WXPayHelper.getInstance().weixinPayRefund(out_trade_no, out_refund_no, total_fee, refund_fee);
	}
}
